#include <iostream>
#include <unistd.h>
#include <vector>
#include "mypthread.hpp"
#include "LockGuard.hpp"
using namespace ThreadMoudle;

// void Print(const std::string& name)
// {
//     int cnt = 1;
//     while(true)
//     {
//         std::cout << name << "is running, cnt:" << cnt++ << std::endl;
//         sleep(1);
//     }
// }
// const int gnum = 10;

// int tickets = 1000;
// pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// void route(const std::string &name)
// {
//     while (true)
//     {
//         pthread_mutex_lock(&mutex);
//         if (tickets > 0)
//         {
//             // 抢票过程
//             usleep(1000); // ms -> 模拟抢票花费的时间
//             printf("who:%s, tickets:%d\n", name.c_str(), tickets);
//             tickets--;
//             pthread_mutex_unlock(&mutex);
//         }
//         else
//         {
//             pthread_mutex_unlock(&mutex);
//             break;
//         }
//     }
// }


// static int num = 5;
// int tickets = 1000;

// void route(ThreadData* td)
// {
//     while (true)
//     {
//         pthread_mutex_lock(td->_lock);
//         if (tickets > 0)
//         {
//             // 抢票过程
//             usleep(1000); // ms -> 模拟抢票花费的时间
//             printf("who:%s, tickets:%d\n", td->_name.c_str(), tickets);
//             tickets--;
//             pthread_mutex_unlock(td->_lock);
//         }
//         else
//         {
//             pthread_mutex_unlock(td->_lock);
//             break;
//         }
//     }
// }

static int num = 5;
int tickets = 1000;

void route(ThreadData* td)
{
    while (true)
    {
        LockGuard lockguard(td->_lock);
        if (tickets > 0)
        {
            // 抢票过程
            usleep(1000); // ms -> 模拟抢票花费的时间
            printf("who:%s, tickets:%d\n", td->_name.c_str(), tickets);
            tickets--;
        }
        else
        {
            break;
        }
    }
}
int main()
{
    pthread_mutex_t mutex;
    pthread_mutex_init(&mutex, nullptr);
    std::vector<Thread> threads;
    for(int i = 0; i < num; i++)
    {
        std::string name = "Thread-" + std::to_string(i+1);
        ThreadData* td = new ThreadData(name, &mutex);
        threads.emplace_back(name, route, td);
    }

    for(auto& thread:threads)
    {
        thread.Start();
    }

    for(auto& thread:threads)
    {
        thread.Join();
    }

    pthread_mutex_destroy(&mutex);











    // Thread t1("Thread-1", route);
    // Thread t2("Thread-2", route);
    // Thread t3("Thread-3", route);
    // Thread t4("Thread-4", route);

    // t1.Start();
    // t2.Start();
    // t3.Start();
    // t4.Start();

    // t1.Join();
    // t2.Join();
    // t3.Join();
    // t4.Join();

    // 构建线程对象
    //  std::vector<Thread> threads;
    //  for(int i = 0; i < gnum; i++)
    //  {
    //      std::string name = "thread-" + std::to_string(i + 1);
    //      threads.emplace_back(name, Print);
    //      sleep(1);
    //  }

    // //统一启动
    // for(auto& thread:threads)
    // {
    //     thread.Start();
    // }
    // sleep(10);
    // //统一结束
    // for(auto& thread:threads)
    // {
    //     thread.Stop();
    // }
    // //统一等待
    // for(auto& thread:threads)
    // {
    //     thread.Join();
    // }
    // Thread t("Thread-1", Print);
    // t.Start();
    // std::cout << t.Name() << " ,status:" << t.Status() << std::endl;
    // sleep(10);
    // std::cout << t.Name() << " ,status:" << t.Status() << std::endl;
    // t.Stop();
    // sleep(1);
    // std::cout << t.Name() << " ,status:" << t.Status() << std::endl;
    // t.Join();
    // std::cout << "join done" << std::endl;
    return 0;
}